/**
 * All rights Reserved, Designed By 林溪
 * Copyright:    Copyright(C) 2016-2020
 * Company       溪云阁 .
 */

package com.boots.shorturl.common.utils;

import java.util.Random;
import java.util.UUID;

/**
 * 短链接工具类
 * @author：溪云阁
 * @date：2020年6月11日
 */
public class ShortUrlUtils {

    /**
     * 获取短链接
     * @author 溪云阁
     * @param host 请求的URL解析出来的域名信息
     * @param length 自定义你需要的短链接长度
     * @return String 返回的短链接
     */
    public static String getShortUr(int length) {
        // 定义偏移量,每6个生成一个字符
        final int PER_VARCHAR = 6;
        // 定义数字+大小写字母的字符数组
        final char[] c = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
                'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
                'V', 'W', 'X', 'Y', 'Z' };
        // 2的35次方，每五位一个字符，可生成7个字符
        final long long16 = (long) Math.pow(2, PER_VARCHAR * length) - 1;
        // 生成的随机数里面存在-的话直接用空空字符串替代
        final String a = UUID.randomUUID().toString().replace("-", "");
        // 生成随机数，使之成为35长度
        final Random random = new Random();
        // 每8字符=32位，加3位=111
        final int nextInt = random.nextInt(8);
        // 偏移起始位置
        int subIndexStart = 0;
        // 定义需要返回的短链接后缀
        final StringBuffer sb = new StringBuffer();
        while (subIndexStart < a.length()) {
            // 8位一组，使用16进行转换，可转换成 4*8=32长度二进制
            final String substring = a.substring(subIndexStart, subIndexStart += 8);
            final long parseLong = Long.parseLong(nextInt + substring, 16);
            long x = long16 & parseLong;
            for (int j = 0; j < length; j++) {
                final long x2 = c.length - 1 & x;
                sb.append(c[(int) x2]);
                x = x >> PER_VARCHAR;
            }
            return sb.toString();
        }
        return null;
    }

}
